package com.briup.server;

import com.briup.entity.Environment;
import com.briup.util.JDBCUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.Collection;

public class DBStoreImpl2 implements DBStore {
    @Override
    /**
     * 根据采集时间中的日期进行数据插入
     */
    public void saveDB(Collection<Environment> collection) throws Exception {
        //获取连接
        Connection connection = JDBCUtil.getConnection();
        int i=0;
        int day=0;
        String sql=null;
        PreparedStatement ps=null;
        for (Environment environment : collection) {
            //获取采集时间 中的日期
            int date = environment.getGatherDate().getDate();
            //检测 采集数据的日期发生变化
            if (day!=date){
                day=date;
                //处理前一天 未满足批处理 阈值的数据  但是要考虑 初始日期的变化
                if (ps!=null){
                    ps.executeBatch();
                    ps.clearBatch();
                    ps.close();
                }
                //每一天的sql都不一样  因为日期的变化  导致sql不是同构语句  所以 ps也要变
                 sql = "insert into e_detail_"+day+"(id,name,srcId,descId,devId,count,cmd,status,data,gather_date) values(seq_"+day+".nextval,?,?,?,?,?,?,?,?,?)";
                //创建statement对象
                 ps = connection.prepareStatement(sql);
            }

            ps.setString(1,environment.getName());
            ps.setString(2,environment.getSrcId());
            ps.setString(3,environment.getDescId());
            ps.setString(4,environment.getDevId());
            ps.setInt(5,environment.getCount());
            ps.setString(6,environment.getCmd());
            ps.setInt(7,environment.getStatus());
            ps.setFloat(8,environment.getData());
            ps.setTimestamp(9,environment.getGatherDate());
            //添加sql到batch
            ps.addBatch();
            //因为数据量过大的批处理可能会导致数据丢失 所以每五千条处理一次
            if (i++ == 5000) {
                ps.executeBatch();
                //计数器复位
                i=0;
            }
        }
        ps.executeBatch();
        //关闭资源
        JDBCUtil.close(connection, ps);
    }
}
